package memory.memoryStorage;

/**
 * 内存存储模型
 */
public class MemoryDivide {

    static int a = 0;  //堆空间
    int b = 1; //堆空间

    public void test(){
        int a1 = 10; //栈空间
        int b1 = 10; //栈空间

        String s = "s" ; //堆空间
        Person p = new Person("zs" , 20); //引用变量存储在栈空间，对象在堆空间
    }

    /**
     * 这个类我们可以分析出
     * 1）、堆内存溢出
     *      由代码可以看出出现堆内存溢出可能是某处创建了大量的对象，或者全局变量、静态变量，或者大量的String，
     *      而没有被及时回收。
     *      解决方式：单例类、将类作为参数传递、StringBuild或者StringBuffer代替String等。
     *
     *  2)、栈内存溢出
     *      由代码可以看出，有可能是某一方法中创建了大量的基本类型或者引用变量。
     *      解决方法：根据实际情况而定，大部分情况下修改逻辑或者优化算法。
     *
     *  3）、在1.8以前还有一个永久代内存溢出，但是在1.8及以后的版本中基本不会出现了，因为对应的内存区域已经被放到本地内存中了，
     *      理论上只要本机内存够用，就不会溢出。
     */



    public static void main(String[] args) {
        MemoryDivide m = new MemoryDivide();
        MemoryDivide m1 = m;
        System.out.println(m);
        System.out.println(m1);
    }

}

class Person{
    String name;
    int age;

    public Person(String name , int age){
        this.name = name;
        this.age = age;
    }
}
